/*
* 
* Fichier source projet intel Acceler8 sous license GNU GPL v3.
* Voir http://www.gnu.org/copyleft/gpl.html pour plus d'informations
* La license est egalement disponible dans le repertoire /doc
* 
* Cree le : mardi 15 novembre 2011 à 14 : 57.
* Auteurs : Axel MOINET et Arnaud DURAND.
* 
* Nom de fichier : filtreCalculCgh.cpp
* Chemin du fichier : ./src/classes/filtreCalculCgh/filtreCalculCgh.cpp
* 
* Description :
* 
*/

#include "filtreCalculCgh.h"

filtreCalculCGH::filtreCalculCGH(threadPrincipal *p_thread) : tbb::filter(serial_in_order) {
	this->thread = p_thread;
	this->tableau = p_thread->getPrefixeTab();
}

void* filtreCalculCGH::operator ()(void*) {
	//Si h est arrivé à la taille du tableau, on attend que le tableau soit agrandit sauf si la lecture est terminée
	if( *(this->thread->h) >= (*(this->tableau)).size() && !this->thread->getEndFileFlag()) {
		waitForData(this->tableau, *(this->thread->h), this->thread);
	}
	if( *(this->thread->g) == (*(this->tableau)).size() )
			return NULL;

	//Calcul du CGH et envoi au filtre suivant pour calcul de sous-séquence.
	this->cghTab = new tbb::concurrent_vector<int>();
	this->cghTab->grow_by( (*(this->thread->getPrefixeTab()))[0].size() );

	tbb::parallel_for(tbb::blocked_range<int>(0, (*(this->thread->getPrefixeTab() ))[0].size()), parallelForCGH(*(this->thread->g), *(this->thread->h), this->thread, this->cghTab));

	struct structCGH *structure = new struct structCGH;

	structure->g = *(this->thread->g);
	structure->h = *(this->thread->h);
	structure->cgh = this->cghTab;

	(*(this->thread->h))++;

	if (*(this->thread->h) >= (*(this->tableau)).size() && this->thread->getEndFileFlag()) {
		(*(this->thread->g))++;
		*(this->thread->h) = *(this->thread->g);
	}

	return structure;
}
